<?php

namespace Mogod\Lib\Code;

/**
 *
 * Генератор виртуальных классов
 *
 * @author goorus, morph
 *
 */
class Generator_ClassGeneratorVirtual extends ClassGenerator
{

	/**
	 * Корень виртуальной ФС
	 *
	 * @var vfsStreamAbstractContent
	 */
	protected $root;

	/**
	 * Возвращает корень виртуальной ФС
	 *
	 * @return \vfsStreamDirectory
	 */
	protected function getRoot()
	{
		if (!$this->root) {
			$this->root = \vfsStream::newDirectory('root');
			\vfsStreamWrapper::setRoot($this->root);
		}
		return $this->root;
	}

	/**
	 * Возвращает путь до корневого каталога
	 *
	 * @return string
	 */
	public function getRootDir()
	{
		return \vfsStream::url($this->getRoot()->getName());
	}

	/**
	 * Создает файл в виртуальной файловой системе
	 *
	 * @param string $className
	 * @param boolean $addUnique [optional] Добавить к имени файла уникальный
	 * суффикс
	 * @return ClassVirtual
	 */
	public function make($className, $addUnique = false)
	{
		$p = strrpos($className, '\\');
		$namespace = substr($className, 0, $p);
		$class = $p ? substr($className, $p + 1) : $className;

		if ($addUnique) {
			static $counter = 0;
			$class .= 'c' . (++$counter);
		}

		$file = $namespace
			? str_replace('\\', '/', $namespace) . '/'
			: '';

		$file = $file
			. str_replace('_', '/', $class)
			. '.php';

		$root = $this->getRoot();
		$dirs = explode('/', $file);
		$filename = array_pop($dirs);
		$dir = $root;

		foreach ($dirs as $dirname) {
			$child = \vfsStream::newDirectory($dirname);
			$dir->addChild($child);
			$dir = $child;
		}

		$handle = \vfsStream::newFile($filename);
		$dir->addChild($handle);

		$description = new ClassVirtual();
		$description
			->setNamespace($namespace)
			->setName($class)
			->setFile(\vfsStream::url($file))
			->setHandle($handle);

		$handle->setContent($this->generate($description));

		return $description;
	}

}